package com.bweab.dao.base;

import com.bweab.pojo.UsersTb;
import com.bweab.util.JDBCUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class BaseDao<T>{

    //使用commons-dbutils提供的方法
    QueryRunner queryRunner= new QueryRunner();

/**
 * 查询单个对象
 * @param sql  传入sql语句
 * @param  objectClass 传入封装查询结果的对象
 * @param  params 查询条件的传入
 * */
    public T querySingle(String sql,Class<T> objectClass ,Object ...params){
        //查询单个对象

        //首先获取数据库连接
        Connection connection = JDBCUtil.getConnection();
        try {
            //查询数据并且返回对象
            T query = queryRunner.query(connection,sql, new BeanHandler<>(objectClass), params);
            System.out.println("查询单个对象成功");

            JDBCUtil.closeConnection(connection);

            return query;
        } catch (SQLException e) {
            throw new RuntimeException(e);

        }




    }

    //查询多个对象

    /**
     * @param sql 传入的sql语句
     * @param objectClass 传入要返回对象.class
     * @param params  传入sql语句参数 没有可以不写
     * */
    public List<T> queryList(String sql,Class<T> objectClass,Object ...params){
        //获取数据库连接
        Connection connection = JDBCUtil.getConnection();
        try {
            //查询多个对象
            List<T> tList = queryRunner.query(connection, sql, new BeanListHandler<>(objectClass), params);
            System.out.println("查询多个对象成功");

            //关闭数据库连接
            JDBCUtil.closeConnection(connection);
            return tList;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

    public int alter(String sql,Object ...params){

        //获取数据库连接
        Connection connection=JDBCUtil.getConnection();
        //数据更新
        try {
            int alterRow = queryRunner.update(connection, sql, params);
            JDBCUtil.closeConnection(connection);
            System.out.println(alterRow);;
            return alterRow;//返回影响的行数
        } catch (SQLException e) {

            throw  new RuntimeException(e);

        }



    }
}
